package com.wyl.neo4j.respository;

import org.springframework.data.neo4j.repository.Neo4jRepository;
import org.springframework.data.repository.NoRepositoryBean;

/**
 * @author 吴宇亮 on 2022/8/3 9:20
 * @param <T> entity类型
 * @param <ID> entity的ID类型
 */
@NoRepositoryBean
public interface Neo4jRepositoryBase<T, ID> extends Neo4jRepository<T, ID> {

//    default <KEY extends String, VALUE> T findOneNodeByProperty(Map<KEY, VALUE> propertyMap, Class<T> clazz){
//        List<T> list = findNodeByProperty(propertyMap, clazz);
//        return CollUtil.isNotEmpty(list) ? list.get(0) : null;
//    }
//
//    default <KEY extends String, VALUE> List<T> findNodeByProperty(Map<KEY, VALUE> propertyMap, Class<T> clazz){
//        StringBuilder cql = new StringBuilder();
//        cql.append("MATCH (n:").append(clazz.getSimpleName().toLowerCase()).append(") ");
//        if(CollUtil.isNotEmpty(propertyMap)){
//            cql.append("WHERE ");
//            boolean isFirst = true;
//            for (KEY key : propertyMap.keySet()) {
//                VALUE value = propertyMap.get(key);
//                if(isFirst){
//                    isFirst = false;
//                } else {
//                    cql.append(" AND ");
//                }
//
//                if(value instanceof String){
//                    cql.append(" n.").append(key).append(" = \"").append(value).append("\" ");
//                } else {
//                    cql.append(" n.").append(key).append(" = ").append(value).append(" ");
//                }
//            }
//        }
//        cql.append("RETURN n ");
//
//        try (Session session = Neo4jUtil.getSession()){
//            System.out.println(cql);
//            List<Record> records = session.readTransaction(tx -> tx.run(cql.toString()).list());
//            return records.stream().map(record -> {
//                Entity entity = record.values().get(0).asEntity();
//                Map<String, Object> objectMap = new HashMap<>(entity.asMap());
//                objectMap.put("id", entity.id());
//                return BeanUtil.mapToBean(objectMap, clazz, false, CopyOptions.create());
//            }).collect(Collectors.toList());
//        }
//    }
}
